<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Symbol应用 消除魔术字符串: 
    // 魔术字符串指的是，在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码，应该尽量消除魔术字符串，改由含义清晰的变量代替

    // a 参与运算符的第一个数值
    // opt 参与运算符的运算符 + - * / %
    // b 参与运算符的第2个数值
    function calc(a, opt, b) {
        var sum = 0;
        if (opt === "+") {
            sum = Number(a) + Number(b);
        } else if (opt === "-") {
            sum = Number(a) - Number(b);
        } else if (opt === "*") {
            sum = Number(a) * Number(b);
        } else if (opt === "/") {
            sum = Number(a) / Number(b);
        } else if (opt === "%") {
            sum = Number(a) % Number(b);
        }
        return sum;
    }

    // "+" => 传入到函数calc()中被形参opt接收(opt="+"),然后参数条件判断 => 问题: 传入的字符串和参与比较的字符串 ,并不是同一个字符串   => 魔术字符串(在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值) 
    // console.log(calc(10, "+", 2));


    // 消除魔术字符串
    // 传入的字符串和参与比较的字符串 ,是同一个字符串  => 自己和自己比 

    // var calcOptions = {
    //     add: "+",
    //     red: "-",
    //     mul: "*",
    //     div: "/",
    //     mod: "%",
    // }

    // 自己和自己比  => 叫什么都无所谓
    // var calcOptions = {
    //     add: 1,
    //     red: 2,
    //     mul: 3,
    //     div: 4,
    //     mod: 5,
    // }

    // 自己和自己比  => 叫什么都无所谓 => 设置为独一无二的值
    var calcOptions = {
        add: Symbol("+"),
        red: Symbol("-"),
        mul: Symbol("*"),
        div: Symbol("/"),
        mod: Symbol("%"),
    }

    debugger;
    function calc(a, opt, b) {
        var sum = 0;
        if (opt === calcOptions.add) {
            sum = Number(a) + Number(b);
        } else if (opt === calcOptions.red) {
            sum = Number(a) - Number(b);
        } else if (opt === calcOptions.mul) {
            sum = Number(a) * Number(b);
        } else if (opt === calcOptions.div) {
            sum = Number(a) / Number(b);
        } else if (opt === calcOptions.mod) {
            sum = Number(a) % Number(b);
        }
        return sum;
    }

    console.log(calc(10, calcOptions.add, 2));

</script>

</html>